# -*- coding: utf-8 -*-
# @Author  : longbhu
# @Time    : 2025/4/21 17:02
# @Function:
import os
import re
import rasterio
import numpy as np
import pandas as pd

from calc_v1.tif_tools.para import eco_codes


def count_unique_values_and_fill_excel(folder_path: str, output_excel: str) -> None:
    """
    遍历指定文件夹中的所有 TIFF 文件，根据固定统计表中的 eco_code 列表，
    统计每个 TIFF 文件中每个 eco_code 的出现次数，并将结果填入对应的 value 列。
    如果某个 eco_code 不存在，则填入 0。所有结果保存到一个 Excel 文件中。

    参数:
    folder_path (str): 包含 TIFF 文件的文件夹路径。
    excel_file_path (str): 固定统计表的 Excel 文件路径。
    output_excel (str): 输出的 Excel 文件路径。

    返回:
    None
    """
    # 读取固定统计表
    fixed_df = pd.DataFrame({'eco_code': eco_codes})
    # 遍历文件夹中的所有 TIFF 文件
    for file_name in os.listdir(folder_path):
        if file_name.endswith('.tif') or file_name.endswith('.tiff'):
            tif_file_path = os.path.join(folder_path, file_name)
            print(f"Processing file: {tif_file_path}")

            # 使用正则表达式从文件名中提取 6 位数字
            match = re.search(r'\d{6}', file_name)
            if match:
                value_column_name = f"{match.group()}"
            else:
                raise ValueError(f"文件名 {file_name} 中未找到 6 位数字")

            # 读取 TIFF 文件的数据
            with rasterio.open(tif_file_path, 'r') as src:
                data = src.read(1)  # 假设数据在第一个波段

            # 统计 TIFF 数据中的唯一值及其数量
            unique_values, counts = np.unique(data, return_counts=True)
            value_counts = dict(zip(unique_values, counts))

            # 遍历固定统计表中的 eco_code，填入对应的 value
            fixed_df[value_column_name] = fixed_df['eco_code'].apply(lambda x: value_counts.get(x, 0))

    # 保存到新的 Excel 文件
    fixed_df.to_excel(output_excel, index=False)

    print(f"统计结果已保存到 {output_excel}")

# 示例调用
folder_path = r'H:\land30m2010\制作成新国标标准\maskByShp'
output_excel = r'H:\land30m2010\制作成新国标标准\统计结果_china.xlsx'

count_unique_values_and_fill_excel(folder_path, output_excel)